/*
 * Copyright (c) 2024 endless-sky
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <atomic>
#include <memory>
#include <string>
#include <vector>
#include <chrono>
#include "utils_noncopyable.h"

namespace El {
namespace Record {

// 视频文件信息结构体
struct VideoFileInfo {
    int32_t ch{0};                               // 通道号
    std::chrono::system_clock::time_point start; // 文件开始时间
    std::chrono::system_clock::time_point end;   // 文件结束时间
    uint32_t size{0};                            // 文件大小(字节)
    uint32_t event{0};                           // 事件类型
    int32_t type{0};                             // 码流类型(0:主码流, 1:辅码流)
    bool hasAudio{false};                        // 是否包含音频
    double fps{0.0};                             // 视频帧率
    uint32_t bitRate{0};                         // 视频码率(kbps)
    std::string fileName;                        // 文件名
};

// 图片文件信息结构体
struct ImageFileInfo {
    int32_t ch{0};                              // 通道号
    std::chrono::system_clock::time_point time; // 抓图时间
    uint32_t size{0};                           // 文件大小(字节)
    uint32_t event{0};                          // 事件类型
    uint32_t width{0};                          // 图片宽度
    uint32_t height{0};                         // 图片高度
    bool hasThumbnail{false};                   // 是否有缩略图
    std::string fileName;                       // 文件名
};

// 合并后的搜索接口
class IRecordSearch;
using RecordSearchPtr = std::shared_ptr<IRecordSearch>;
using TimePoint = std::chrono::system_clock::time_point;

class IRecordSearch {
public:
    virtual ~IRecordSearch() = default;

    static RecordSearchPtr create();

    /**
     * @brief 搜索视频文件
     * @param ch 通道号
     * @param start 开始时间
     * @param end 结束时间
     * @return true 成功，false 失败
     */
    virtual bool searchVideo(int32_t ch, TimePoint start, TimePoint end) = 0;

    /**
     * @brief 获取下一批视频文件
     * @param count 要获取的文件数量
     * @param found 实际找到的文件数量
     * @param fileList 找到的视频文件列表
     * @return true 成功，false 失败
     */
    virtual bool findNextVideo(int32_t count, int32_t &found, std::vector<VideoFileInfo> &fileList) = 0;

    /**
     * @brief 关闭搜索
     * @return true 成功，false 失败
     */
    virtual bool closeVideo() = 0;

    /**
     * @brief 搜索图片文件
     * @param ch 通道号
     * @param start 开始时间(UTC秒)
     * @param end 结束时间(UTC秒)
     * @return true 成功，false 失败
     */
    virtual bool searchImage(int32_t ch, TimePoint start, TimePoint end) = 0;

    /**
     * @brief 获取下一批图片文件
     * @param count 要获取的文件数量
     * @param found 实际找到的文件数量
     * @param fileList 找到的图片文件列表
     * @return true 成功，false 失败
     */
    virtual bool findNextImage(int32_t count, int32_t &found, std::vector<ImageFileInfo> &fileList) = 0;

    /**
     * @brief 关闭搜索
     * @return true 成功，false 失败
     */
    virtual bool closeImage() = 0;
};

} // namespace Record
} // namespace El